import pandas as pd
import numpy as np
# import sys
# sys.path.append('D:/gitee/python-script-new/papertools/')

from paper_tool.papertools import r2

def find_group_min_index(data_sheet, group):
    min_values = [float('inf')] * len(group)  # 初始化一个列表，用于存储每列的最小值，默认设置为正无穷大
    for i, column in enumerate(group):
        for value in data_sheet[column]:
            if value < min_values[i]:
                min_values[i] = value
    min_value = min(min_values)
    min_index = min_values.index(min_value)
    return min_index
def find_group_index(data_sheet, group, keyword):
  
    group_values = [data_sheet[column][0] for column in group]
    target_value = ''
    # return "Invalid keyword. Please use 'min', 'middle', or 'max'."
    if keyword == 'min':
        target_value = min(group_values)
    elif keyword == 'middle':
        sorted_values = sorted(group_values)
        target_value = sorted_values[len(group_values) // 2]        
    elif keyword == 'max':
        target_value = max(group_values)
    else:
        return 0

    return group_values.index(target_value)


def get_group_columns(column_names):
    groups = {}
    
    for column in column_names:
        parts = column.split('_')
        key = '_'.join(parts[:-1])  # 使用除最后一个单词外的部分作为键
        
        if key in groups:
            groups[key].append(column)
        else:
            groups[key] = [column]
    
    grouped_columns = list(groups.values())
    return grouped_columns


def generate_integer_dataV3(data_sheet1,num_rows=150, min_value=1, max_value=5, columns=None):
    # 一定要使用正态分布的随机数, 指定标准偏差, 否则生成的数据很不合理, 完全无法检验  
    # 2023-1125更新, 最终解决无法检验问题的方法: 
    # 1. 生成数据的时候计算数据的方差, 如果等于0,就重新生成数据,直到方差不为0 ; 
    # 2. 检查变量间的皮尔逊相关系数, 找出相关性高的变量, 将某一列数据重新生成
    
    means = data_sheet1.iloc[0].values
    if columns is None:
        columns = [f"Column_{i + 1}" for i in range(len(means))]

    grouped_columns = get_group_columns(columns)

    generated_data = []

    total_index = 0  
    for group_index, group in enumerate(grouped_columns):
        # 查找平均数的索引, 生成种子数据
        # 有时候也需要根据最大值或者中间值
        # np.random.choice(['min','middle', 'max'])
        seed_index = find_group_index(data_sheet1,group,'middle')   
        for item_index, column in enumerate(group):
            if item_index == seed_index:  # 当 item_index 为 0 时生成数据，否则赋空值
                while True:                    
                    # 即将被替换为新的generate_integersV1函数
                    # sort_order_way:[升序,降序,中间高两边低,乱序]
                    # data = r2.test_random_int(means[total_index], num_rows)
                    order_way = np.random.choice(['asc','desc','random'])
                    data = r2.generate_integersV1(means[total_index], num_rows,min_value,max_value,sort_order_way = order_way)
                    variance = np.var(data)
                    if variance != 0:
                        break
            else:
                data = [None] * num_rows  # 赋空值
            generated_data.append(data)
            total_index += 1

    df = pd.DataFrame(generated_data).T
    df.columns = columns

    return df

""" file_path = 'dest/20231125-231918_truncatedNew.xlsx' 
# file_path = 'dest/20231129-135223_truncatedNew.xlsx' 

# 读取sheet1的数据
data_from_sheet1 = pd.read_excel(file_path, sheet_name='Sheet1')
# iloc[0]是一个pandas库中的函数，用于获取数据框中的第一行数据。在这里，我们使用iloc[0]来获取Excel文件中第一行的数据。如果你想获取其他行的数据，只需将0替换为所需的行号即可
# mean_values = data_from_sheet1.iloc[0].values

"""

def filter_empty_columns(df):
    # 获取全部为空的列索引
    empty_columns = df.columns[df.isnull().all()].tolist()
    
    # 过滤空列并返回结果
    filtered_df = df.drop(empty_columns, axis=1)
    return filtered_df


def main_step2(data_sheet1,file_path,sheet_name,quantity,isFilter = False):

    # 调用函数生成数据
    generated_data = generate_integer_dataV3(data_sheet1,quantity,min_value=1, max_value=5,columns=data_sheet1.columns)    

    # 创建一个名为 random_data 的新数据框（DataFrame），并将其赋值为空数据框。
    # random_data = pd.DataFrame()

    # 遍历原表的25列数据
    """ for index,col in enumerate(data_sheet.columns):
        # temp_data = pd.DataFrame()
        print(col)
        # 从data_from_sheet中提取标题栏和第二行数据作为平均值 """
    if isFilter:
        generated_data = filter_empty_columns(generated_data)

    # 保存生成的数据到sheet2
    with pd.ExcelWriter(file_path, mode='a', engine='openpyxl') as writer:
        generated_data.to_excel(writer, sheet_name=sheet_name, index=False)

    print("Step2: Data generated and saved to ", sheet_name)


if __name__ == "__main__":
    file_path = 'dest/20231204-163318_truncatedNew.xlsx'
    # 读取sheet1的数据
    data_from_sheet1 = pd.read_excel(file_path, sheet_name='Sheet1')

    main_step2(data_from_sheet1,file_path,'sheet_test',180,isFilter=True)

